677e5d
@@ -463,7 +463,7 @@
public VectorExpression getVectorExpression(ExprNodeDesc exprDesc, Mode mode) th
       ve = getColumnVectorExpression((ExprNodeColumnDesc) exprDesc, mode);
     } else if (exprDesc instanceof ExprNodeGenericFuncDesc) {
       ExprNodeGenericFuncDesc expr = (ExprNodeGenericFuncDesc) exprDesc;
-      if (isCustomUDF(expr) || isNonVectorizedPathUDF(expr)) {
+      if (isCustomUDF(expr) || isNonVectorizedPathUDF(expr, mode)) {
         ve = getCustomUDFExpression(expr);
       } else {
 
@@ -752,7 +752,7 @@
private GenericUDF getGenericUDFForCast(TypeInfo castType) throws HiveException
    * Depending on performance requirements and frequency of use, these
    * may be implemented in the future with an optimized VectorExpression.
    */
-  public static boolean isNonVectorizedPathUDF(ExprNodeGenericFuncDesc expr) {
+  public static boolean isNonVectorizedPathUDF(ExprNodeGenericFuncDesc expr, Mode mode) {
     GenericUDF gudf = expr.getGenericUDF();
     if (gudf instanceof GenericUDFBridge) {
       GenericUDFBridge bridge = (GenericUDFBridge) gudf;
@@ -794,6 +794,9 @@
public static boolean isNonVectorizedPathUDF(ExprNodeGenericFuncDesc expr) {
                 || arg0Type(expr).equals("double")
                 || arg0Type(expr).equals("float"))) {
       return true;
+    } else if (gudf instanceof GenericUDFBetween && (mode == Mode.PROJECTION)) {
+      // between has 4 args here, but can be vectorized like this 
+      return true;
     }
     return false;
   }
@@ -1196,7 +1199,7 @@
private VectorExpression getGenericUdfVectorExpression(GenericUDF udf,
     childExpr = castedChildren;
 
     //First handle special cases
-    if (udf instanceof GenericUDFBetween) {
+    if (udf instanceof GenericUDFBetween && mode == Mode.FILTER) {
       return getBetweenFilterExpression(childExpr, mode, returnType);
     } else if (udf instanceof GenericUDFIn) {
       return getInExpression(childExpr, mode, returnType);
